import re
from pathlib import Path
from typing import TypedDict

# 输出目录
OUTPUT_DIR = Path('data/output')
# 输出目录不存在则创建
OUTPUT_DIR.mkdir(exist_ok=True)

# 条款数据结构
class ArticleRow(TypedDict):
    chapter_id:  int         # 第一章对应为1，第二章对应为2，如对应章节标题不是第几章，则该值为-1
    chapter_no:  str         # "第一章", "第二章"
    chapter_title:  str      # "章节标题", 注意章节标题中间的空格可以去掉
    article_id: int          # 第一条对应为1，第二条对应为2，如果只是章节标题的文本，而不是条款的文本，则该值为-1
    article_no: str          # "第一条", "第二条", "第三条"
    text: str                # "条款的详细文本......"


def chinese_to_arabic(chinese_num: str) -> int:
    # 基础数字映射
    char_map = {
        '零': 0, '一': 1, '二': 2, '三': 3, '四': 4, '五': 5,
        '六': 6, '七': 7, '八': 8, '九': 9
    }
    # 单位映射（含常用异体字）
    unit_map = {
        '十': 10, '百': 100, '千': 1000,
        '万': 10000, '亿': 100000000,
        '拾': 10, '佰': 100, '仟': 1000  # 财务大写支持
    }

    total = 0      # 最终结果
    current = 0    # 当前小节累加值（如“三百”的3 * 100）
    section = 0    # 当前大节值（用于处理万/亿）
    last_unit = 0  # 记录上一个单位值（用于零的规则）

    for char in chinese_num:
        if char in char_map:
            num = char_map[char]
            current = num
            last_unit = 0  # 数字后重置单位标记
        elif char in unit_map:
            unit = unit_map[char]
            # 处理“十”开头的省略（如“十五”）
            if unit == 10 and current == 0:
                current = 1

            # 大单位（万/亿）：结算当前大节
            if unit >= 10000:
                section = (section + current) * unit
                total = section
                section = 0  # 重置大节
            # 小单位（十/百/千）：累加当前小节
            else:
                if current == 0:  # 处理“一千零三”
                    current = 1
                current *= unit
                section += current

            current = 0
            last_unit = unit  # 记录单位用于零规则
        else:
            raise ValueError(f"无效字符: {char}")

    # 处理结尾无单位的情况（如“一百五”）
    if last_unit < 10:  # 上个字符是数字
        section += current

    return total + section


def parse_regulation_text(text):
    # 用于存储解析后的结果
    result: list[ArticleRow] = []
    # 当前条款的基本信息
    current_article: ArticleRow = None
    # 标题
    title: str = ""
    # 用于累积当前条款的多行文本
    article_lines: list[str] = []

    # 分割文本为行并过滤空行
    lines = [line.strip() for line in text.split('\n') if line.strip()]

    for line in lines:
        # 匹配章标题（示例：第一章  总则）
        chapter_match = re.match(r'第(\S+?)章\s+(.+)', line)
        # 匹配条标题（示例：第一条...）
        article_match = re.match(r'第(\S+?)条\s*(.+)', line)

        if chapter_match:
            # 结束上一个章节的积累
            if article_lines:
                article = current_article.copy()
                article['article_content'] = f""
                result.append({
                    "level-1-id": current_chapter_id,
                    "level-2-id": current_article_id,
                    "text": '\n'.join(article_lines)
                })
                article_lines = []
                current_article_id = None

            # 解析章序号
            chapter_num = chapter_match.group(1)
            if chapter_num:
                num_val = chinese_to_arabic(chapter_num)
            else:
                raise Exception("章节序号不能为空")

            current_chapter_id = num_val

            # 添加章节点
            result.append({
                "level-1-id": current_chapter_id,
                "level-2-id": -1,
                "text": line
            })

        elif article_match:
            # 结束上一个条款的积累
            if article_lines:
                result.append({
                    "level-1-id": current_chapter_id,
                    "level-2-id": current_article_id,
                    "text": '\n'.join(article_lines)
                })
                article_lines = []

            # 解析条款序号
            article_num = article_match.group(1)
            if article_num:
                num_val = chinese_to_arabic(article_num)
            else:
                raise Exception("条款序号不能为空")

            current_article_id = num_val
            article_lines.append(line)

        else:
            # 普通文本行，累积到当前条款
            article_lines.append(line)

    # 处理最后一个条款的积累
    if article_lines:
        result.append({
            "level-1-id": current_chapter_id,
            "level-2-id": current_article_id,
            "text": '\n'.join(article_lines)
        })

    return result


def main(path: str):
    src_path = Path(path)
    with open(src_path, "r", encoding="utf-8") as f:
        text = f.read()
        result = parse_regulation_text(text)
    for row in result:
        if row["level-1-id"]:
            print(f'{row["level-1-id"]:01d}, {row["level-2-id"]:02d}, {len(row["text"]):03d}\n{row["text"]}')

    filename = src_path.as_posix().split('/')[-1]
    write_to_file(text, filename)


def write_to_file(text: str, filename: str):
    with open(OUTPUT_DIR.joinpath(filename), "w", encoding="utf-8") as f:
        f.write(text)


if __name__ == "__main__":
    import fire
    fire.Fire(main)
